import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression, Ridge, Lasso
from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
import warnings
warnings.filterwarnings('ignore')

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

# 数据加载与预处理
def load_and_preprocess_data():
    print("===== 数据加载与预处理 =====")
    df = pd.read_excel('上市公司营收数据.xlsx')
    print(f"原始数据形状: {df.shape}")
    
    # 创建特征变量
    # 计算一些财务比率作为新特征
    df['毛利率'] = (df['营业收入'] - df['营业成本']) / df['营业收入']
    df['资产负债率'] = df['负债合计'] / df['资产总计']
    df['权益乘数'] = df['资产总计'] / df['所有者权益合计']
    df['现金流量比率'] = df['经营活动产生的现金流量净额'] / df['负债合计']
    df['投资活动比率'] = df['投资活动产生的现金流量净额'] / df['资产总计']
    
    # 处理可能的无穷大值
    df.replace([np.inf, -np.inf], np.nan, inplace=True)
    df.dropna(inplace=True)
    print(f"处理后数据形状: {df.shape}")
    
    # 准备特征和目标变量
    # 排除非数值列和目标变量
    X = df.drop(['证券代码', '证券简称', '营业收入'], axis=1)
    y = df['营业收入']
    
    print(f"特征数量: {X.shape[1]}")
    print(f"特征列表: {X.columns.tolist()}")
    
    return X, y, df

# 数据探索分析
def exploratory_data_analysis(df):
    print("\n===== 数据探索分析 =====")
    
    # 基本统计描述
    print("\n营业收入统计描述:")
    print(df['营业收入'].describe())
    
    # 相关性分析
    print("\n相关性分析:")
    corr_matrix = df.corr()
    revenue_corr = corr_matrix['营业收入'].sort_values(ascending=False)
    print(revenue_corr)
    
    # 绘制相关性热力图
    plt.figure(figsize=(12, 10))
    sns.heatmap(corr_matrix, annot=False, cmap='coolwarm', vmin=-1, vmax=1)
    plt.title('财务指标相关性热力图')
    plt.tight_layout()
    plt.savefig('相关性热力图.png', dpi=300)
    plt.close()
    
    return revenue_corr

# 模型训练与评估
def train_and_evaluate_models(X, y):
    print("\n===== 模型训练与评估 =====")
    
    # 划分训练集和测试集
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
    
    # 数据标准化
    scaler = StandardScaler()
    X_train_scaled = scaler.fit_transform(X_train)
    X_test_scaled = scaler.transform(X_test)
    
    # 定义模型
    models = {
        '线性回归': LinearRegression(),
        'Ridge回归': Ridge(),
        'Lasso回归': Lasso(),
        '随机森林': RandomForestRegressor(random_state=42),
        '梯度提升树': GradientBoostingRegressor(random_state=42)
    }
    
    # 超参数网格
    param_grids = {
        'Ridge回归': {'alpha': [0.01, 0.1, 1.0, 10.0, 100.0]},
        'Lasso回归': {'alpha': [0.01, 0.1, 1.0, 10.0, 100.0]},
        '随机森林': {
            'n_estimators': [50, 100, 200],
            'max_depth': [None, 10, 20, 30],
            'min_samples_split': [2, 5, 10]
        },
        '梯度提升树': {
            'n_estimators': [50, 100, 200],
            'learning_rate': [0.01, 0.1, 0.2],
            'max_depth': [3, 5, 7]
        }
    }
    
    # 训练和评估模型
    results = {}
    best_models = {}
    
    for name, model in models.items():
        print(f"\n训练模型: {name}")
        
        if name in param_grids:
            # 使用网格搜索优化超参数
            grid_search = GridSearchCV(model, param_grids[name], cv=5, scoring='neg_mean_squared_error', n_jobs=-1)
            grid_search.fit(X_train_scaled, y_train)
            best_model = grid_search.best_estimator_
            best_params = grid_search.best_params_
            print(f"最佳参数: {best_params}")
        else:
            # 线性回归没有超参数
            best_model = model
            best_model.fit(X_train_scaled, y_train)
        
        # 预测
        y_pred = best_model.predict(X_test_scaled)
        
        # 评估
        mse = mean_squared_error(y_test, y_pred)
        rmse = np.sqrt(mse)
        mae = mean_absolute_error(y_test, y_pred)
        r2 = r2_score(y_test, y_pred)
        
        print(f"均方根误差 (RMSE): {rmse:.2f}")
        print(f"平均绝对误差 (MAE): {mae:.2f}")
        print(f"决定系数 (R²): {r2:.4f}")
        
        results[name] = {'RMSE': rmse, 'MAE': mae, 'R²': r2}
        best_models[name] = best_model
    
    # 绘制模型性能对比图
    plot_model_comparison(results)
    
    # 找出最佳模型
    best_model_name = max(results, key=lambda x: results[x]['R²'])
    print(f"\n最佳模型: {best_model_name}")
    print(f"最佳模型性能: R² = {results[best_model_name]['R²']:.4f}")
    
    return best_models, best_model_name, results, X_test, y_test, scaler

# 绘制模型性能对比图
def plot_model_comparison(results):
    model_names = list(results.keys())
    r2_scores = [results[name]['R²'] for name in model_names]
    rmse_values = [results[name]['RMSE'] for name in model_names]
    
    fig, axes = plt.subplots(1, 2, figsize=(15, 6))
    
    # R²对比
    axes[0].barh(model_names, r2_scores, color='skyblue')
    axes[0].set_xlabel('R² Score')
    axes[0].set_title('各模型R²得分对比')
    axes[0].set_xlim(0, 1)
    
    # RMSE对比
    axes[1].barh(model_names, rmse_values, color='lightcoral')
    axes[1].set_xlabel('RMSE')
    axes[1].set_title('各模型RMSE对比')
    
    plt.tight_layout()
    plt.savefig('模型性能对比.png', dpi=300)
    plt.close()

# 特征重要性分析
def feature_importance_analysis(best_models, best_model_name, X):
    print("\n===== 特征重要性分析 =====")
    
    best_model = best_models[best_model_name]
    feature_names = X.columns
    
    if hasattr(best_model, 'feature_importances_'):
        # 树模型的特征重要性
        importances = best_model.feature_importances_
        indices = np.argsort(importances)[::-1]
        
        print("特征重要性排序:")
        for i in range(len(importances)):
            print(f"{i+1}. {feature_names[indices[i]]}: {importances[indices[i]]:.4f}")
        
        # 绘制特征重要性图
        plt.figure(figsize=(12, 8))
        plt.title(f'{best_model_name} - 特征重要性')
        plt.bar(range(X.shape[1]), importances[indices])
        plt.xticks(range(X.shape[1]), [feature_names[i] for i in indices], rotation=90)
        plt.tight_layout()
        plt.savefig('特征重要性.png', dpi=300)
        plt.close()
        
    elif hasattr(best_model, 'coef_'):
        # 线性模型的系数
        coefs = best_model.coef_
        indices = np.argsort(np.abs(coefs))[::-1]
        
        print("特征系数排序:")
        for i in range(len(coefs)):
            print(f"{i+1}. {feature_names[indices[i]]}: {coefs[indices[i]]:.4f}")
        
        # 绘制系数图
        plt.figure(figsize=(12, 8))
        plt.title(f'{best_model_name} - 特征系数')
        plt.bar(range(X.shape[1]), coefs[indices])
        plt.xticks(range(X.shape[1]), [feature_names[i] for i in indices], rotation=90)
        plt.tight_layout()
        plt.savefig('特征系数.png', dpi=300)
        plt.close()

# 生成预测结果可视化
def visualize_predictions(best_models, best_model_name, X_test, y_test, scaler):
    print("\n===== 预测结果可视化 =====")
    
    best_model = best_models[best_model_name]
    y_pred = best_model.predict(scaler.transform(X_test))
    
    # 绘制预测 vs 实际值散点图
    plt.figure(figsize=(10, 8))
    plt.scatter(y_test, y_pred, alpha=0.5)
    plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--', lw=2)
    plt.xlabel('实际营业收入')
    plt.ylabel('预测营业收入')
    plt.title(f'{best_model_name} - 预测值 vs 实际值')
    plt.tight_layout()
    plt.savefig('预测vs实际.png', dpi=300)
    plt.close()
    
    # 绘制残差图
    residuals = y_test - y_pred
    plt.figure(figsize=(10, 6))
    plt.scatter(y_pred, residuals, alpha=0.5)
    plt.axhline(y=0, color='r', linestyle='--')
    plt.xlabel('预测营业收入')
    plt.ylabel('残差')
    plt.title(f'{best_model_name} - 残差图')
    plt.tight_layout()
    plt.savefig('残差图.png', dpi=300)
    plt.close()

# 生成HTML分析报告
def generate_html_report(df, revenue_corr, results, best_model_name, best_models, X):
    print("\n===== 生成HTML分析报告 =====")
    
    # 获取特征重要性数据
    feature_importance_data = []
    best_model = best_models[best_model_name]
    if hasattr(best_model, 'feature_importances_'):
        # 树模型的特征重要性
        importances = best_model.feature_importances_
        indices = np.argsort(importances)[::-1]
        for i in indices:
            feature_importance_data.append((X.columns[i], importances[i]))
    elif hasattr(best_model, 'coef_'):
        # 线性模型的系数
        coefs = best_model.coef_
        indices = np.argsort(np.abs(coefs))[::-1]
        for i in indices:
            feature_importance_data.append((X.columns[i], coefs[i]))
    
    report_content = f'''
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>上市公司营收预测分析报告</title>
        <style>
            /* 全局样式 */
            * {{
                box-sizing: border-box;
                margin: 0;
                padding: 0;
            }}
            
            body {{
                font-family: "Microsoft YaHei", Arial, sans-serif;
                line-height: 1.8;
                color: #333;
                background-color: #f5f7fa;
                max-width: 1200px;
                margin: 0 auto;
                padding: 20px;
            }}
            
            /* 标题样式 */
            h1, h2, h3, h4 {{
                color: #2c3e50;
                margin-top: 30px;
                margin-bottom: 20px;
                font-weight: 600;
            }}
            
            h1 {{
                font-size: 2.5em;
                text-align: center;
                margin-top: 0;
                margin-bottom: 30px;
                padding-bottom: 15px;
                border-bottom: 3px solid #3498db;
                color: #2c3e50;
            }}
            
            h2 {{
                font-size: 1.8em;
                border-left: 5px solid #3498db;
                padding-left: 15px;
                background-color: #ecf0f1;
                padding: 10px 15px;
                border-radius: 0 5px 5px 0;
            }}
            
            h3 {{
                font-size: 1.4em;
                color: #34495e;
                margin-top: 25px;
            }}
            
            /* 摘要样式 */
            .summary {{
                background-color: #ffffff;
                padding: 30px;
                border-radius: 10px;
                margin-bottom: 40px;
                box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
                border-left: 5px solid #3498db;
            }}
            
            .summary h2 {{
                margin-top: 0;
                border: none;
                background: none;
                padding: 0;
                color: #2c3e50;
            }}
            
            /* 表格样式 */
            table {{
                width: 100%;
                border-collapse: collapse;
                margin: 25px 0;
                background-color: #ffffff;
                border-radius: 8px;
                overflow: hidden;
                box-shadow: 0 2px 10px rgba(0, 0, 0, 0.08);
            }}
            
            th, td {{
                padding: 15px;
                text-align: left;
                border-bottom: 1px solid #e0e0e0;
            }}
            
            th {{
                background-color: #3498db;
                color: white;
                font-weight: 600;
                text-transform: uppercase;
                font-size: 0.9em;
            }}
            
            tr:nth-child(even) {{
                background-color: #f8f9fa;
            }}
            
            tr:hover {{
                background-color: #e3f2fd;
            }}
            
            /* 图表容器 */
            .chart-container {{
                margin: 30px 0;
                text-align: center;
                background-color: #ffffff;
                padding: 20px;
                border-radius: 10px;
                box-shadow: 0 2px 10px rgba(0, 0, 0, 0.08);
            }}
            
            .chart-container img {{
                max-width: 100%;
                height: auto;
                border: 1px solid #e0e0e0;
                border-radius: 8px;
                transition: transform 0.3s ease;
            }}
            
            .chart-container img:hover {{
                transform: scale(1.02);
            }}
            
            /* 强调框 */
            .highlight {{
                background-color: #e3f2fd;
                padding: 20px;
                border-radius: 8px;
                margin: 25px 0;
                border-left: 5px solid #2196f3;
                box-shadow: 0 2px 8px rgba(33, 150, 243, 0.1);
            }}
            
            .highlight p {{
                margin: 0;
                font-size: 1.05em;
            }}
            
            /* 列表样式 */
            ul, ol {{
                margin-left: 30px;
                margin-bottom: 20px;
            }}
            
            li {{
                margin-bottom: 10px;
                position: relative;
            }}
            
            ul li::before {{
                content: "●";
                color: #3498db;
                font-weight: bold;
                display: inline-block;
                width: 1em;
                margin-left: -1em;
            }}
            
            /* 段落样式 */
            p {{
                margin-bottom: 15px;
                text-align: justify;
                color: #4a5568;
            }}
            
            /* 数据卡片 */
            .data-card {{
                background-color: #ffffff;
                padding: 25px;
                border-radius: 10px;
                margin: 20px 0;
                box-shadow: 0 2px 10px rgba(0, 0, 0, 0.08);
            }}
            
            /* 数值格式化 */
            .large-number {{
                font-family: 'Courier New', monospace;
                color: #e74c3c;
                font-weight: bold;
            }}
            
            /* 响应式设计 */
            @media (max-width: 768px) {{
                body {{
                    padding: 10px;
                }}
                
                h1 {{
                    font-size: 2em;
                }}
                
                h2 {{
                    font-size: 1.5em;
                }}
                
                table {{
                    font-size: 0.9em;
                }}
                
                th, td {{
                    padding: 10px;
                }}
            }}
        </style>
    </head>
    <body>
        <h1>上市公司营收预测分析报告</h1>
        
        <div class="summary">
            <h2>摘要</h2>
            <p>本报告基于{df.shape[0]}家上市公司的财务数据，建立了多种营收预测模型，并深入分析了影响上市公司营收的关键因素。通过对多个模型的评估比较，我们确定了最优预测模型，并基于分析结果提出了投资建议。</p>
            <p><strong>最佳预测模型：</strong>{best_model_name}</p>
            <p><strong>模型性能：</strong>R² = {results[best_model_name]['R²']:.4f}</p>
        </div>
        
        <div class="data-card">
            <h2>1. 数据概览</h2>
            <p>数据集包含{df.shape[0]}条记录和{df.shape[1]}个财务指标，涵盖了上市公司的资产负债、经营成果和现金流量等多个维度。</p>
            
            <h3>数据集主要内容</h3>
            <ul>
                <li>基本信息：证券代码和证券简称</li>
                <li>经营成果：营业收入、营业成本、毛利率</li>
                <li>资产负债：资产总计、负债合计、所有者权益合计、资产负债率、权益乘数</li>
                <li>现金流量：经营活动、投资活动、筹资活动现金流量净额及相关比率</li>
            </ul>
            
            <h3>营业收入统计描述</h3>
            <table>
                <tr>
                    <th>统计指标</th>
                    <th>数值</th>
                </tr>
                <tr>
                    <td>均值</td>
                    <td class="large-number">{df['营业收入'].mean():,.2f}</td>
                </tr>
                <tr>
                    <td>中位数</td>
                    <td class="large-number">{df['营业收入'].median():,.2f}</td>
                </tr>
                <tr>
                    <td>标准差</td>
                    <td class="large-number">{df['营业收入'].std():,.2f}</td>
                </tr>
                <tr>
                    <td>最小值</td>
                    <td class="large-number">{df['营业收入'].min():,.2f}</td>
                </tr>
                <tr>
                    <td>最大值</td>
                    <td class="large-number">{df['营业收入'].max():,.2f}</td>
                </tr>
            </table>
        </div>
        
        <div class="data-card">
            <h2>2. 相关性分析</h2>
            <p>相关性分析有助于我们了解各财务指标与营业收入之间的关系强度。以下是各指标与营业收入的相关系数排序：</p>
            
            <table>
                <tr>
                    <th>排名</th>
                    <th>财务指标</th>
                    <th>相关系数</th>
                    <th>相关性强度</th>
                </tr>
    '''
    
    # 添加相关性数据，包括排名和相关性强度
    rank = 1
    for index, value in revenue_corr.items():
        if index != '营业收入':
            # 判断相关性强度
            corr_abs = abs(value)
            if corr_abs > 0.8:
                strength = "强相关"
            elif corr_abs > 0.5:
                strength = "中等相关"
            elif corr_abs > 0.3:
                strength = "弱相关"
            else:
                strength = "极弱相关"
            
            # 设置颜色类
            if value > 0.8:
                color_class = "positive-strong"
            elif value > 0.3:
                color_class = "positive-weak"
            elif value < -0.8:
                color_class = "negative-strong"
            elif value < -0.3:
                color_class = "negative-weak"
            else:
                color_class = "neutral"
            
            report_content += f'''
            <tr>
                <td>{rank}</td>
                <td>{index}</td>
                <td class="{color_class}">{value:.4f}</td>
                <td>{strength}</td>
            </tr>
            '''
            rank += 1
    
    report_content += f'''
            </table>
            
            <p><strong>关键发现：</strong>营业成本与营业收入的相关性最高（{revenue_corr['营业成本']:.4f}），呈现极强的正相关关系。投资活动产生的现金流量净额与营业收入呈较强的负相关关系（{revenue_corr['投资活动产生的现金流量净额']:.4f}）。</p>
            
            <div class="chart-container">
                <h3>相关性热力图</h3>
                <p>热力图直观展示了所有财务指标之间的相关关系：</p>
                <img src="相关性热力图.png" alt="相关性热力图">
            </div>
        </div>
        
        <div class="data-card">
            <h2>3. 模型构建与评估</h2>
            <p>我们构建并评估了多种预测模型，包括线性模型和集成学习模型，以确定最优的营收预测方法。</p>
            
            <table>
                <tr>
                    <th>模型名称</th>
                    <th>RMSE</th>
                    <th>MAE</th>
                    <th>R²</th>
                    <th>性能评级</th>
                </tr>
    '''
    
    # 添加模型结果，包括性能评级
    for name, metrics in results.items():
        # 性能评级
        r2 = metrics['R²']
        if r2 > 0.95:
            rating = "优秀"
        elif r2 > 0.8:
            rating = "良好"
        elif r2 > 0.6:
            rating = "一般"
        else:
            rating = "较差"
        
        report_content += f'''
            <tr>
                <td>{name}</td>
                <td class="large-number">{metrics['RMSE']:,.2f}</td>
                <td class="large-number">{metrics['MAE']:,.2f}</td>
                <td>{metrics['R²']:.4f}</td>
                <td>{rating}</td>
            </tr>
            '''
    
    report_content += f'''
            </table>
            
            <div class="highlight">
                <p><strong>模型评估结论：</strong>{best_model_name}在所有模型中表现最佳，R²值达到{results[best_model_name]['R²']:.4f}，表明该模型能够解释约{results[best_model_name]['R²']*100:.1f}%的营收变异。这说明财务指标之间存在很强的线性关系。</p>
            </div>
            
            <div class="chart-container">
                <h3>模型性能对比</h3>
                <p>下图展示了各模型的R²得分和RMSE对比：</p>
                <img src="模型性能对比.png" alt="模型性能对比图">
            </div>
        </div>
        
        <div class="data-card">
            <h2>4. 特征重要性分析</h2>
            <p>基于{best_model_name}的特征重要性分析，我们识别出了对上市公司营收影响最大的关键因素。以下是详细的特征重要性排序：</p>
            
            <table>
                <tr>
                    <th>排名</th>
                    <th>特征名称</th>
                    <th>系数/重要性</th>
                    <th>影响分析</th>
                </tr>
    '''
    
    # 添加特征重要性详细数据
    for i, (feature_name, importance) in enumerate(feature_importance_data, 1):
        # 根据系数符号进行影响分析
        if hasattr(best_model, 'coef_'):
            if importance > 0:
                impact = "正向影响"
            else:
                impact = "负向影响"
        else:
            impact = "重要特征"
        
        report_content += f'''
            <tr>
                <td>{i}</td>
                <td>{feature_name}</td>
                <td>{importance:,.4f}</td>
                <td>{impact}</td>
            </tr>
            '''
    
    report_content += f'''
            </table>
            
            <p><strong>关键洞察：</strong></p>
            <ul>
                <li>资产总计、负债合计和所有者权益合计是影响营收的最重要因素</li>
                <li>这些财务指标反映了公司的整体规模和财务结构</li>
                <li>营业成本也显示出较高的重要性，这与相关性分析结果一致</li>
            </ul>
            
            <div class="chart-container">
                <h3>特征重要性可视化</h3>
                <p>{best_model_name}的特征重要性/系数可视化：</p>
                <img src="特征系数.png" alt="特征重要性图">
            </div>
        </div>
        
        <div class="data-card">
            <h2>5. 预测结果分析</h2>
            <p>使用最佳模型进行预测，以下是预测结果的详细分析：</p>
            
            <div class="chart-container">
                <h3>预测值 vs 实际值</h3>
                <p>散点图展示了预测值与实际值的分布情况，理想情况下点应该分布在对角线上：</p>
                <img src="预测vs实际.png" alt="预测vs实际图">
            </div>
            
            <div class="chart-container">
                <h3>残差分析</h3>
                <p>残差图展示了预测误差的分布，有助于识别模型的系统性偏差：</p>
                <img src="残差图.png" alt="残差图">
            </div>
        </div>
        
        <div class="data-card">
            <h2>6. 结论与建议</h2>
            
            <h3>主要发现</h3>
            <ol>
                <li>基于{df.shape[0]}家上市公司的财务数据，成功构建了具有高精度的营收预测模型</li>
                <li>{best_model_name}表现最优，R²值达{results[best_model_name]['R²']:.4f}，预测能力极强</li>
                <li>通过特征重要性分析，明确了影响上市公司营收的关键驱动因素，主要是公司规模相关指标</li>
                <li>财务指标之间存在显著的线性关系，这可能与会计恒等式有关</li>
            </ol>
            
            <h3>投资建议</h3>
            <ul>
                <li><strong>规模导向：</strong>关注资产规模较大的上市公司，这类公司通常具有更高的营收水平</li>
                <li><strong>现金流分析：</strong>经营活动现金流与营收呈正相关，可作为营收质量的重要指标</li>
                <li><strong>财务结构优化：</strong>合理的资产负债率有助于公司稳定发展和营收增长</li>
                <li><strong>行业差异：</strong>建议在实际投资决策中进一步结合行业特点进行分析</li>
            </ul>
            
            <h3>模型应用与改进</h3>
            <ul>
                <li>本模型可用于初步筛选和评估上市公司的营收表现</li>
                <li>局限性：仅基于财务数据，未考虑宏观经济、行业周期等外部因素</li>
                <li>未来改进方向：
                    <ul>
                        <li>引入更多维度的数据，如市场份额、研发投入、行业地位等</li>
                        <li>考虑时间序列因素，建立动态预测模型</li>
                        <li>按行业分类建立细分模型，提高预测精度</li>
                        <li>定期更新模型参数，适应市场变化</li>
                    </ul>
                </li>
            </ul>
        </div>
        
        <div style="text-align: center; margin-top: 50px; color: #7f8c8d; font-size: 0.9em;">
            <p>报告生成时间：{pd.Timestamp.now().strftime('%Y年%m月%d日 %H:%M')}</p>
        </div>
    </body>
    </html>
    '''
    
    with open('上市公司营收预测分析报告.html', 'w', encoding='utf-8') as f:
        f.write(report_content)
    
    print("HTML分析报告已生成: 上市公司营收预测分析报告.html")

# 主函数
def main():
    print("===== 上市公司营收预测分析开始 =====")
    
    # 数据加载与预处理
    X, y, df = load_and_preprocess_data()
    
    # 数据探索分析
    revenue_corr = exploratory_data_analysis(df)
    
    # 模型训练与评估
    best_models, best_model_name, results, X_test, y_test, scaler = train_and_evaluate_models(X, y)
    
    # 特征重要性分析
    feature_importance_analysis(best_models, best_model_name, X)
    
    # 预测结果可视化
    visualize_predictions(best_models, best_model_name, X_test, y_test, scaler)
    
    # 生成HTML报告
    generate_html_report(df, revenue_corr, results, best_model_name, best_models, X)
    
    print("\n===== 上市公司营收预测分析完成 =====")

if __name__ == "__main__":
    main()